#ifndef KEY_H
#define KEY_H


#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_log.h"
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

// --- 修改这里以匹配你的按键接线 ---
#ifndef KEY_PIN_PREV
#define KEY_PIN_PREV    47 // 上一项（修改为你实际的GPIO）
#endif
#ifndef KEY_PIN_NEXT
#define KEY_PIN_NEXT    48 // 下一项（修改为你实际的GPIO）
#endif
#ifndef KEY_PIN_OK
#define KEY_PIN_OK      46 // 确认键（修改为你实际的GPIO）
#endif
// --------------------------------------

// 抖动与点击阈值（ms）
#define KEY_DEBOUNCE_MS  40
#define KEY_CLICK_MAX_MS 600


// 键 ID
typedef enum {
    KEY_ID_PREV = 0,
    KEY_ID_NEXT,
    KEY_ID_OK,
    KEY_ID_MAX
} key_id_t;

// 键动作
typedef enum {
    KEY_ACT_PRESS = 0,
    KEY_ACT_RELEASE,
    KEY_ACT_CLICK
} key_action_t;


// 键事件结构
typedef struct {
    key_id_t id;
    key_action_t act;
} key_event_t;

// 注册回调（可选）
typedef void (*key_callback_t)(const key_event_t *evt);

// 初始化按键驱动（安装ISR、启动处理任务）
void keys_init(void);

// 从事件队列取一条事件（timeout 为 pdMS_TO_TICKS(...) 或 portMAX_DELAY）
bool key_get_event(key_event_t *out_evt, TickType_t timeout);

// 注册回调（NULL 表示取消）
void key_register_callback(key_callback_t cb);


#ifdef __cplusplus
}
#endif


#endif // _KEY_H